{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 156,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "from collections import OrderedDict\n",
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import torch\n",
    "from torchvision.datasets import MNIST\n",
    "from torch.utils.data import DataLoader, random_split\n",
    "from torchvision import transforms\n",
    "\n",
    "import cooper\n",
    "from copy import deepcopy as copy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [],
   "source": [
    "class LogisticRegression(torch.nn.Module):\n",
    "    def __init__(self, input_dim, output_dim):\n",
    "        super(LogisticRegression, self).__init__()\n",
    "        self.input_dim = input_dim\n",
    "        self.linear = torch.nn.Linear(input_dim, output_dim)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = x.view(-1, self.input_dim)\n",
    "        outputs = self.linear(x)\n",
    "        return outputs\n",
    "\n",
    "\n",
    "class NormConstrainedLogReg(cooper.ConstrainedMinimizationProblem):\n",
    "    def __init__(self):\n",
    "        self.criterion = torch.nn.CrossEntropyLoss()\n",
    "        super().__init__(is_constrained=True)\n",
    "\n",
    "    def closure(self, model, inputs, targets):\n",
    "\n",
    "        pred_logits = model.forward(inputs)\n",
    "        loss = self.criterion(pred_logits, targets)\n",
    "\n",
    "        # We want each row of W to have norm less than or equal to 1\n",
    "        # g(W) <= 1  ---> g(W) - 1 <= 0\n",
    "        ineq_defect = model.linear.weight.norm(dim=1) - 1\n",
    "\n",
    "        return cooper.CMPState(loss=loss, ineq_defect=ineq_defect, eq_defect=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [],
   "source": [
    "dataset = MNIST(os.getcwd() + \"/data\", download=True, transform=transforms.ToTensor())\n",
    "train_set, val_set = random_split(dataset, [55000, 5000])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 199,
   "metadata": {},
   "outputs": [],
   "source": [
    "cmp = NormConstrainedLogReg()\n",
    "formulation = cooper.LagrangianFormulation(cmp)\n",
    "\n",
    "model = LogisticRegression(784, 10)\n",
    "\n",
    "# primal_optimizer = cooper.optim.ExtraSGD(model.parameters(), lr=1e-3, momentum=0.9)\n",
    "# dual_optimizer = cooper.optim.partial_optimizer(cooper.optim.ExtraSGD, lr=5e-3)\n",
    "\n",
    "primal_optimizer = torch.optim.SGD(model.parameters(), lr=1e-3, momentum=0.9)\n",
    "dual_optimizer = cooper.optim.partial_optimizer(torch.optim.SGD, lr=5e-3)\n",
    "\n",
    "coop = cooper.ConstrainedOptimizer(\n",
    "    formulation=formulation,\n",
    "    primal_optimizer=primal_optimizer,\n",
    "    dual_optimizer=dual_optimizer,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 201,
   "metadata": {},
   "outputs": [],
   "source": [
    "iter_num = 0\n",
    "\n",
    "state_history = OrderedDict()\n",
    "\n",
    "for epoch in range(3):\n",
    "    for inputs, targets in DataLoader(train_set, batch_size=64):\n",
    "\n",
    "        coop.zero_grad()\n",
    "        lagrangian = formulation.composite_objective(\n",
    "            cmp.closure, model, inputs, targets\n",
    "        )\n",
    "        formulation.custom_backward(lagrangian)\n",
    "        coop.step(cmp.closure, model, inputs, targets)\n",
    "\n",
    "        if iter_num % 5 == 0:\n",
    "            state_history[iter_num] = {\n",
    "                \"cmp\": cmp.state,\n",
    "                \"dual\": copy(formulation.state()),\n",
    "            }\n",
    "\n",
    "        iter_num += 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 202,
   "metadata": {},
   "outputs": [],
   "source": [
    "iters, loss_history = zip(\n",
    "    *[(iter_num, _[\"cmp\"].loss.item()) for (iter_num, _) in state_history.items()]\n",
    ")\n",
    "mult_hist = np.stack(\n",
    "    [_[\"dual\"][0].data.numpy() for (foo, _) in state_history.items()], axis=1\n",
    ")\n",
    "defect_hist = np.stack(\n",
    "    [_[\"cmp\"].ineq_defect.data.numpy() for (foo, _) in state_history.items()], axis=1\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 203,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(iters, mult_hist[0:1, ...].T)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 204,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(iters, defect_hist[0:1, ...].T)\n",
    "plt.axhline(0.0, c=\"r\", alpha=0.2)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 205,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x17c8b0a8490>]"
      ]
     },
     "execution_count": 205,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(iters, loss_history)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 206,
   "metadata": {},
   "outputs": [],
   "source": [
    "total, correct = 0, 0\n",
    "with torch.no_grad():\n",
    "    for inputs, targets in DataLoader(val_set, batch_size=64):\n",
    "        outputs = model.forward(inputs)\n",
    "        _, predicted = torch.max(outputs.data, 1)\n",
    "        total += targets.size(0)\n",
    "        correct += (predicted == targets).sum()\n",
    "accuracy = 100 * correct / total"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 207,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor(87.2600)"
      ]
     },
     "execution_count": 207,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "5b5416066f703e73dc2bf3c4e66d036632ca71ae166bbdd9bd33a210b8a690df"
  },
  "kernelspec": {
   "display_name": "Python 3.8.12 ('cooper')",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.12"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
